package com.topcent.tioxyc.controller;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * @author: 陈百万
 * @date: 2025/9/18 16:30
 * @Description: 给图片添加水印平铺
 */

public class ImageWatermarkUtil {

    /**
     * 给图片添加平铺水印（支持水印按比例缩放）
     * @param targetImageUrl 目标图片路径（本地文件）
     * @param watermarkImageUrl 水印图片路径（本地文件）
     * @param outputPath 输出图片路径
     * @param gap 水印间距（像素）
     * @param opacity 水印透明度（0-1）
     * @param scaleRatio 水印缩放比例（0.1~1.0，1.0为原尺寸，0.5为缩小50%）
     * @throws IOException
     */
    public static void addImageTiledWatermark(String targetImageUrl, String watermarkImageUrl,
                                              String outputPath, int gap, float opacity, float scaleRatio) throws IOException {
        // 1. 读取目标图片和原始水印图片
        BufferedImage targetImage = ImageIO.read(new File(targetImageUrl));
        BufferedImage originalWatermark = ImageIO.read(new File(watermarkImageUrl));

        // 2. 计算缩放后的水印尺寸（保持宽高比）
        int originalWmWidth = originalWatermark.getWidth();
        int originalWmHeight = originalWatermark.getHeight();
        // 缩放后的宽度 = 原宽度 * 缩放比例
        int scaledWmWidth = Math.round(originalWmWidth * scaleRatio);
        // 缩放后的高度 = 原高度 * 缩放比例
        int scaledWmHeight = Math.round(originalWmHeight * scaleRatio);

        // 3. 创建绘图对象，开启抗锯齿（缩放后更清晰）
        Graphics2D g = targetImage.createGraphics();
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, opacity));
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); // 抗锯齿

        int targetWidth = targetImage.getWidth();
        int targetHeight = targetImage.getHeight();

        // 4. 平铺缩放后的水印
        for (int y = 0; y < targetHeight; y += scaledWmHeight + gap) {
            for (int x = 0; x < targetWidth; x += scaledWmWidth + gap) {
                // 绘制缩放后的水印：x,y为左上角坐标，scaledWmWidth/scaledWmHeight为缩放后的尺寸
                g.drawImage(originalWatermark, x, y, scaledWmWidth, scaledWmHeight, null);
            }
        }

        // 5. 释放资源并保存
        g.dispose();
        String format = outputPath.substring(outputPath.lastIndexOf(".") + 1);
        ImageIO.write(targetImage, format, new File(outputPath));
    }

    public static void main(String[] args) {
        try {
            String targetUrl = "D:\\img\\CH.1021-盖子.jpg"; // 目标图片URL
            String watermarkUrl = "D:\\img\\2025watermark.png"; // 水印图片URL
            String outputPath = "D:\\img\\output.jpg"; // 输出图片路径
            addImageTiledWatermark(targetUrl, watermarkUrl, outputPath, 50, 0.5f, 0.9f);
            System.out.println("图片水印添加完成");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
